package com.ai.zuochengyun.phase01.class03;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 使用队列实现栈结构
 */
public class Code02_QueueImplementStack {

    public static void main(String[] args) {
        TwoQueueStack<Integer> myStack = new TwoQueueStack<>();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        myStack.push(4);
        myStack.push(5);

        myStack.pop();
        myStack.pop();
        myStack.peek();
        myStack.peek();
        myStack.push(6);
        myStack.push(7);

        while (!myStack.isEmpty()) {
            myStack.pop();
        }
    }


    public static class TwoQueueStack<T> {

        private Queue<T> queue;
        private Queue<T> help;

        public TwoQueueStack() {
            queue = new LinkedList<>();
            help = new LinkedList<>();
        }

        public void push(T value) {
            queue.offer(value);
        }

        public T pop() {
            // 队列是先进先出，所以当元素大于1时，将最后进入的元素留下，让其他的元素弹出，加入help队列
            // 然后弹出queue的最后一个元素，实现栈的后进先出的功能
            while (queue.size() > 1) {
                help.offer(queue.poll());
            }
            T ans = queue.poll();
            // 让两者角色互换，有元素的作为queue队列，无元素的作为help队列
            Queue<T> temp = help;
            help = queue;
            queue = temp;
            System.out.println(ans);
            return ans;
        }

        public T peek() {
            while (queue.size() > 1) {
                help.offer(queue.poll());
            }
            T ans = queue.poll();
            // 不实际弹出元素，所以还是需要将这个元素放入栈顶
            help.offer(ans);
            // 引用地址交换
            Queue<T> temp = queue;
            queue = help;
            help = temp;
            System.out.println(ans);
            return ans;
        }

        public boolean isEmpty() {
            return queue.isEmpty() && help.isEmpty();
        }

    }
}
